package com.yangxk.kadmin.generator;

import com.yangxk.kadmin.generator.config.PackageConfig;
import com.yangxk.kadmin.generator.config.SuperConfig;
import com.yangxk.kadmin.generator.config.TableConfig;
import com.yangxk.kadmin.generator.engine.AbstractTemplateEngine;
import com.yangxk.kadmin.generator.engine.SimpleTemplateEngine;
import com.yangxk.kadmin.generator.engine.TemplateEngineFactory;
import com.yangxk.kadmin.generator.genfile.GeneratorFile;
import com.yangxk.kadmin.generator.internal.ConfigInternal;
import com.yangxk.kadmin.generator.template.TemplateType;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class KGenerator {
    private PackageConfig packageConfig;
    private SuperConfig superConfig;
    private TableConfig tableConfig;
    private TemplateType templateType;
    private Map<String, Object> otherConfig;

    public KGenerator(PackageConfig packageConfig, SuperConfig superConfig, TableConfig tableConfig, TemplateType templateType, Map<String, Object> otherConfig) {
        this.packageConfig = packageConfig;
        this.superConfig = superConfig;
        this.tableConfig = tableConfig;
        this.templateType = templateType;
        this.otherConfig = otherConfig;
    }

    public KGenerator(PackageConfig packageConfig, TableConfig tableConfig, TemplateType templateType, Map<String, Object> otherConfig) {
        this(packageConfig, null, tableConfig, templateType, otherConfig);
    }

    public KGenerator(PackageConfig packageConfig, TableConfig tableConfig, TemplateType templateType) {
        this(packageConfig, null, tableConfig, templateType, new HashMap<>());
    }

    public GenResult generator() {
        ConfigInternal configInternal = new ConfigInternal(packageConfig, superConfig, tableConfig, templateType, otherConfig);

        AbstractTemplateEngine templateEngine = TemplateEngineFactory.getTemplateEngine(templateType);
        templateEngine.init(configInternal);

        List<GeneratorFile> generatorFiles = templateEngine.generator();

        GenResult genResult = new GenResult();
        genResult.setUrl(configInternal.getUrl());
        genResult.setGeneratorFileList(generatorFiles);

        return genResult;
    }
}
